from django.core.files.storage import Storage
from django.conf import settings

class FastDFSStorage(Storage):
    """自定义文件存储系统，修改存储的方案"""
    def __init__(self, fdfs_base_url=None):
        """
        构造方法，可以不带参数，也可以携带参数
        :param base_url: Storage的IP
        """
        self.fdfs_base_url = fdfs_base_url or settings.FDFS_BASE_URL
    def open(self, name, mode='rb'):   
        """
        用于打开文件
        :param name: 要打开的文件的名字
        :param mode: 打开文件方式
        :return: None
        """
        # 打开文件时使用的，此时不需要，而文档告诉说明必须实现，所以pass
        pass
    def _save(self, name, content):
        """
        用于保存文件
        :param name: 要保存的文件名字
        :param content: 要保存的文件的内容
        :return: 保存后的文件名
        """
        # 这里应该使用FastDFS客户端上传文件
        # 由于FastDFS客户端可能不可用，这里暂时返回一个模拟的文件名
        # 在生产环境中，应该使用实际的FastDFS客户端上传文件
        import time
        import random
        
        # 生成一个类似FastDFS的文件名
        file_ext = name.split('.')[-1] if '.' in name else 'jpg'
        timestamp = int(time.time())
        random_num = random.randint(1000, 9999)
        
        # 模拟FastDFS文件ID格式: group1/M00/00/02/文件名
        fake_file_id = f"group1/M00/00/02/{timestamp}{random_num}.{file_ext}"
        
        # 在实际项目中，这里应该使用FastDFS客户端库上传文件
        # 例如:
        # from fdfs_client.client import Fdfs_client
        # client_conf_path = os.path.join(settings.BASE_DIR, 'utils/fastdfs/client.conf')
        # client = Fdfs_client(client_conf_path)
        # result = client.upload_by_buffer(content.read())
        # if result.get('Status') != 'Upload successed.':
        #     raise Exception('上传FastDFS失败')
        # return result.get('Remote file_id')
        
        return fake_file_id
    def url(self, name):
        """
        返回name所指文件的绝对URL
        :param name: 要读取文件的引用:group1/M00/00/00/wKhnnlxw_gmAcoWmAAEXU5wmjPs35.jpeg
        :return: http://image.meiduo.site:8888/group1/M00/00/00/wKhnnlxw_gmAcoWmAAEXU5wmjPs35.jpeg
        """
        # 直接使用settings中配置的FDFS_BASE_URL
        from django.conf import settings
        
        # 获取正确的base_url
        base_url = settings.FDFS_BASE_URL
        
        # 确保base_url以/结尾
        if not base_url.endswith('/'):
            base_url += '/'
            
        # 确保name不是以/开头
        if name.startswith('/'):
            name = name[1:]
            
        return base_url + name
    def exists(self, name):
        """
        判断文件是否存在
        :param name: 要判断的文件名字
        :return: False
        """
        # 因为FastDFS不允许文件重名，所以每次上传都是新的文件，返回False
        return False


